class: inverse,left, middle background-image: url(data:image/png;base64,#background.png) background-size: cover <img src="data:image/png;base64,#LOGO_DIPLOMADO.png" width="500px"/> ##Módulo 1: Manipulación de datos y geoprocesos en R ### Introducción a R MatÃas Olea <br> <a href="https://orcid.org/0000-0003-0194-7784"> ORCID </a><br> matias.olea@pucv.cl</a><br> .large[<b><a href="https://www.pucv.cl/uuaa/site/edic/base/port/labgrs.html">LabGRS</a> | Septiembre 2025</b>] <br> --- class: center,middle background-image: url(data:image/png;base64,#labgrs_logo.png) background-size: 35% --- ## Contenidos .pull-left[ 1) ¿Qué es R? 2) Elementos esenciales de R: Script, objetos, funciones y paquetes. 3) Apertura y manipulación de datos alfanuméricos y numéricos. 4) Creación de funciones y ciclos. ] .pull-right[ <img src="data:image/png;base64,#https://raw.githubusercontent.com/allisonhorst/stats-illustrations/main/rstats-artwork/r_rollercoaster.png" width="650px"/> ] --- ## Introducción a R ### ¿Qué es R? - R es un lenguaje y entorno para la computación estadÃstica y gráficos. - Es un proyecto GNU*. - R proporciona una amplia variedad de estadÃsticos (como modelos lineales y no lineales, test, analisis de series de tiempo, clasificaciones, clustering, etc.) y técnicas gráficas. - Una de las grandes ventajas de R es la facilidad con la que se pueden producir diagramas bien diseñados con la calidad de publicación, que incluyen sÃmbolos matemáticos y fórmulas dónde sea necesario. .footnote[ <span style="font-size:9pt"> * GNU es un sistema operativo gratuito <br> Fuente: r-project.org </span> ] --- ## R <center><img src="data:image/png;base64,#R-project.png" height="80%" /></center> --- ### ¿Qué es R? -- - R es un software de **libre acceso** (gratuito y abierto) para el análisis estadÃstico. -- - Es un pseudo-lenguaje de programación orientado a **''objetos''** -- - Hoy en dÃa, R no es solo una herramienta de análisis estadÃstico. Gracias a su potencialidad se ha transformado en una herramienta para analizar imágenes satelitales, datos del océano, variables biogeográficas, muestras dendro-cronológicas, cambio climático, etc… incluso se pueden hacer mapas. --- ### ¿Qué significa orientado a **objetos**? -- .pull-left[ Significa que si nosotros queremos aplicar una operación (función) podemos aplicárselo a un **"algo"** dentro del entorno de R, y ese "algo" va a ser un **"contenedor"** dónde almacenaremos variables o datos, como por ejemplo números, palabras, vectores, tablas, etc., en nuestro entorno de R. De esta forma, dependiendo que elemento contegamos es nuestro objeto, se definirá la **clase** o tipo del objeto. ] -- .pull-right[ <img src="data:image/png;base64,#Objeto_de_R.png" width="400px" align = "center"/> ] --- ### Creación de un objeto de R -- Para crear un objeto primero debemos definir un **nombre** que debe ser alfabético o alfanumérico. Se recomienda asignarle un nombre <b>intuitivo</b> y <b>fácil</b> de entender en la lógica de lo que queremos trabajar. Por ejemplo si crearemos o cargaremos una tabla, un nombre no intuitivo serÃa <b>t1</b>, y uno intuitivo serÃa <b>tabla_1</b>. De todas manera debe ser algo que le acomode al creador del código, pero se aconseja siempre ser "ordenados" en la creación del código. -- Definido el nombre debemos indicarle una dirección a través del sÃmbolo **<-** seguido de lo que asignaremos en el objeto, como se ve aquÃ: -- ``` r objeto_1 <- 25 objeto_2 <- "Enero" ``` En el ejemplo anterior, primero en el primer objeto llamado **objeto_1** asignamos el valor <b>25</b>, y el segundo, **objeto_2** asignamos la palabra <b>Enero</b>. --- ### Creación de un objeto de R Debemos considerar que los caracteres deben ir entre comillas, sino R los reconoce como objetos de R. -- ``` r objeto_2 <- Enero ```  --- ### Tipos de objetos en R Existen varias **"clases"** (o tipos) de objetos. Y va a depender de lo que "almacenemos" dentro: -- .left-column[ <center><img src="data:image/png;base64,#Objeto_vector.png" height="400px" /></center> ] .right-column[ - **Vector**: secuencia de valores, o valores únicos de tipo numéricos (enteros, dobles/decimales), lógicos, complejos y de caracteres. - **Factor**: Es una variable de tipo categórica que indican ordinalidad, nombres o clases. ] --- ### Tipos de objetos en R Existen varias **"clases"** (o tipos) de objetos. Y va a depender de lo que "almacenemos" dentro: .left-column[ <center><img src="data:image/png;base64,#DF_MX2.png" height="400px" /></center> ] .right-column[ - **Matrices**: estructura bidimensional formada filas y columnas. Pueden ser pensadas similar a que son vetores donde cada vector es una unica fila o columna. Se requiere que todos los elementos dentro de la matriz sean de un mismo tipo: numerico, caracter o factor. - **Data Frame**: tambien es una estructura bidemensional formada por lineas/filas (observaciones) y columnas (variables). Dentro de su estructura, las columnas pueden ser vectores numéricos, de caracteres o factores. Puede almacenar distintos tipos por columnas. Una caracterÃstica distintiva es que almacena "headers" que nombran la variable, pero este forma, y no forma, parte de los datos en si mismo. Las matrices no almacen headers pero si podemos indicarle nombre a cada columna y fila. ] --- ### Tipos de objetos en R Existen varias **"clases"** (o tipos) de objetos. Y va a depender de lo que "almacenemos" dentro: .left-column[ <center><img src="data:image/png;base64,#Objeto_lista.png" height="400px" /></center> ] .right-column[ - **Lista**: Es una compilación de datos enlistados ] --- ### Tipos de objetos en R Existen varias **"clases"** (o tipos) de objetos. Y va a depender de lo que "almacenemos" dentro: .left-column[ <center><img src="data:image/png;base64,#Objeto_lista2.png" height="400px" /></center> ] .right-column[ - **Lista**: Es una compilación de datos enlistados, pueden ser de varias clases. ] --- ### Elementos de R Ya conociendo que son los objetos de R, debemos considerar los siguientes elementos: -- **Funciones**: Son operaciones o aplicaciones que se le aplican a un conjunto de elementos o a un objeto de R. Los podemos reconocer debido a que se escriben seguido de un parentesis: ``` r nombre_funcion(...) ``` -- **Argumentos**: Cada función contiene un cierto número de argumentos o parámetros que permiten que la función sea aplicada. Un argumento puede ser el objeto al que se le aplicará, o alguna indicación extra, como por ejemplo el no considerar valores vacÃos o sin dato: ``` r nombre_funcion(argumento1, argumento2, ...) ``` Cuando una función cuanta con más de un argumento, estos se indican de forma separada por coma (<b>,</b>) --- ### Elementos de R **Paquetes**: Un paquete en R es una colección de funciones y/o datos, la cual el autor ha dedicido que esté disponible para su uso, y luego de pasar por algunos test especÃficos, puede incorporarse al CRAN de R. Una vez el paquete esté disponible en el CRAN facilmente se puede instalar en nuestro R (en nuestros computadores) con la siguiente función: ``` r install.packages("Nombre_del_paquete") # debe indicarse entre comillas. ``` una vez instalado el paquete, y si deseamos incorporarlo y utilizarlo en nuestro código, lo llamamos (activamos) con la siguiente función: ``` r library(Nombre_del_paquete) # debe indicarse sin comillas ``` --- <center><img src="data:image/png;base64,#RStudio.png" height="80%" /></center> --- ### Aplicando conceptos -- Creando objetos con la función concatenar **c()** de R base. -- ``` r constelaciones <- c("Pegasus", "Cetus", "Hydra", "Equuleus") abreviaturas <- c("Peg", "Cet", "Hya", "Equ") numeros <- c(177, 189, 238, 16) secuencia <- c(1:50) ``` -- Consultamos su clase usando la función **class()** -- ``` r class(constelaciones) ``` ``` ## [1] "character" ``` ``` r class(numeros) ``` ``` ## [1] "numeric" ``` ``` r class(secuencia) ``` ``` ## [1] "integer" ``` --- ### Funciones más comunes ``` r mean() # Promedio median() # Mediana sd() # Desviación estandar sum() # Sumatorias exp() # Exponenciales sqrt() # Raiz cuadrada abs() # valores absolutos pi # para el número Pi ``` -- ``` r mean(c(50, 70, 98, 68)) ``` ``` ## [1] 71.5 ``` -- ``` r objeto_numeros <- c(50, 70, 98, 68) sum(objeto_numeros) ``` ``` ## [1] 286 ``` --- ### Funciones más comunes #### Argumentos de una función -- ``` r ??seq() ``` -- ``` r ## from = inicio ## to = final ## by = intervalo ``` -- ``` r seq(from = 2, to = 50, by = 3) ``` ``` ## [1] 2 5 8 11 14 17 20 23 26 29 32 35 38 41 44 47 50 ``` --- ### Operadores lógicos Ocupamos operadores lógicos cuando queremos expresar si una afirmación es verdadera (**TRUE** ó **T**) o falsa (**FALSE** ó **F**). -- - Para decir una negación, o que algo es diferente a ..., usamos el signo de cierre exclamación antes **!** -- <b>Ej. 1:</b> ¿El vector constelaciones es clase númerico? -- ``` r is.numeric(constelaciones) ``` ``` ## [1] FALSE ``` -- <b>Ej. 2:</b> ¿El vector constelaciones es diferente a clase númerico? -- ``` r !is.numeric(constelaciones) ``` ``` ## [1] TRUE ``` --- ### Operadores lógicos Ocupamos operadores lógicos cuando queremos expresar si una afirmación es verdadera (**TRUE** ó **T**) o falsa (**FALSE** ó **F**). - Para referirnos a una condicion "x" **ó** "y", usamos **|** -- <b>Ej. 3:</b> ¿Es el vector secuencia ó el vector constelaciones de clase númerico? (¿es alguno numérico?) -- ``` r is.numeric(secuencia) | is.numeric(constelaciones) ``` ``` ## [1] TRUE ``` -- - Para referirnos a una condición "x" **y** "y", usamos **&** -- <b>Ej. 4:</b> ¿Son el vector secuencia y el vector constelaciones de clase númerico? (¿son ambos numéricos?) -- ``` r is.numeric(secuencia) & is.numeric(constelaciones) ``` ``` ## [1] FALSE ``` --- ### Operadores de relaciones Ocupamos operadores de relaciones cuando queremos establecer desigualdades dentro de nuestro conjunto de datos: -- - Menor o mayor que **<**, **>**. -- - Menor o igual, mayor o igual que **=<**, **>=**. -- - Igual a **==** -- - Diferente a **!=** --- ### Operadores de relaciones #### Algunos ejemplos ``` r set.seed(100) # Esto garantiza que dentro de la aleatoriedad, # todos tengamos el mismo resultado simulado. aleatorios <- rnorm(n = 10, mean = 50, sd = 10) print(aleatorios) ``` ``` ## [1] 44.97808 51.31531 49.21083 58.86785 51.16971 53.18630 44.18209 57.14533 ## [9] 41.74741 46.40138 ``` -- ``` r aleatorios > 50 ``` ``` ## [1] FALSE TRUE FALSE TRUE TRUE TRUE FALSE TRUE FALSE FALSE ``` --- ### Operadores de relaciones #### Algunos ejemplos ``` r which(aleatorios > 50) ``` ``` ## [1] 2 4 5 6 8 ``` -- ``` r which(aleatorios < 45) ``` ``` ## [1] 1 7 9 ``` --- ### Creando una pequeña base de datos estilo tabla ``` r set.seed(100) # Esto garantiza que dentro de la aleatoriedad, # todos tengamos el mismo resultado simulado. vpm1 <- rnorm(n = 100, mean = 80, sd = 5) vpm2 <- rnorm(n = 100, mean = 75, sd = 10) vpm3 <- rnorm(n = 100, mean = 60, sd = 25) tabla <- data.frame(vpm1, vpm2, vpm3) ``` --- ### Creando una pequeña tabla ``` r view(tabla) ```
--- ### Creando una pequeña tabla Existen multiples sintaxis en R o formas de escribir códigos. La más común es que cuando queremos aplicar una secuencia de funciones a un mismo objeto, y al resultado de este, **anidamos** las funciones, es decir escribimos una función dentro de la otra. ``` r funcion_2(funcion_1(objeto_A)) ``` Aquà aplicamos la función funcion_1() al objeto objeto_A, y a su resultado inmediatamente se le aplicó la funcion_2(). Ejemplo: ``` r set.seed(100) round(rnorm(n = 10, mean = 80, sd = 5), digits = 2) ``` ``` ## [1] 77.49 80.66 79.61 84.43 80.58 81.59 77.09 83.57 75.87 78.20 ``` En este ejemplo generamos valores aletorios con la función **rnorm()** e inmediamente aproximamos a 2 decimales utilizando la función **round()**. Otra forma de escribir un código es utilizando la lógica del **encadenando** funciones utilizando **pipes**, algo que veremos en la siguiente unidad cuando trabajemos desde la mirada del paquete tidyverse para ciencia de datos. --- ### Creando una pequeña tabla ``` r tabla_round <- round(tabla, 2) view(tabla) ``` ``` r tabla_round <- round(tabla, 2) ```
--- ### Abriendo un archivo tipo tabla ``` r # Para abrir un archivo en formato csv: # el argumento dec determina el tipo de separador de decimales, y # el argumento sep el separador de columnas tabla_csv <- read.csv("C:/TuDirectorio/MET_CAUQUENES.csv", dec=".") # Para abrir un archivo en formato xls con libreria readxl library(readxl) tabla_excel <- read_excel("C:/TuDirectorio/MET_CAUQUENES.xls",sheet=1) ``` -- ``` r view(tabla_excel) ```
--- ### Manipulando una tablas Las primeras manipulaciones consisten en: - Sustraer - Filtrar - Modificar o - Agregar Información nueva a nuestra base datos. --- ### Manipulando una tablas -- **Sustraer** ``` r # Opción 1: por nombre de la columna sub_1 <- tabla_csv$PP # Opción 2: por posición de la columna sub_2 <- tabla_csv[,5] # Opción 3: por posición de la fila sub_3 <- tabla_csv[58,] ``` --- ### Manipulando una tablas **Filtrar** ``` r # Opcion 1: por condición según columna filtro_1 <- tabla_csv[which(tabla_csv$Month == 3),] # Opción 2: usando función subset() filtro_2 <- subset(tabla_csv, Month == 8) # Opcion 3: usando la función filter() del paquete dplyr #install.package("dplyr") library(dplyr) filtro_3 <- filter(tabla_csv, Year == 2019) ``` --- **Modificar** ``` r # Opción 1: modificar una columna completa mod <- tabla_csv # con esto nos aseguramos de no cometer errores en la original mod$PP <- mod$PP / 1000 # para pasar de mm a cm3 # Opción 2: cambiar algunos elementos según condición mod[which(mod$Year < 1990), ] <- NA # NA es Not Available o sea sin dato mod <- na.omit(mod) # eliminamos las filas con NA's # se podrÃa haber llegado a este mismo resultado solo filtrando # ... y tantas otras opciones que se nos ocurran ``` **Agregar** ``` r mod$Amp <- mod$Tmax - mod$Tmin # creamos una nueva columna amp con la diferencia entre Tmin y Tmax ```
--- ### Manipulando una tablas Combinemos estas acciones. Se requiere obtener el promedio anual de la temperatura mÃnima, media y máxima para el año 2010. -- ``` r # Filtramos nuestros datos al año 2010 filtro_2010 <- filter(tabla_csv, Year == 2010) ``` -- ``` r # Seleccionamos las columnas que necesitamos filtro_2010_temperatura <- filtro_2010[, c(5:7)] ``` -- ``` r # Usamos la función apply para aplicar una función a todas las columnas o filas temperatura_media_2010 <- apply(X = filtro_2010_temperatura, MARGIN = 2, FUN = mean) ``` ``` ## Tmin Tmed Tmax ## 6.713333 13.402500 20.092500 ``` --- ### Manipulando una tablas Ahora ustedes: ¿Cuál es la temperatura mÃnima promedio para el mes de Abril? -- ``` r filtro_abril <- filter(tabla_csv, Month == 4)[, 5] mean(filtro_abril) ``` ``` ## [1] 7.270714 ``` --- ### Manipulando una tablas Ahora ustedes: ¿Cuál es la máxima histórica y la amplitud máxima para el mes de Enero? -- ``` r tabla_csv$Amplitud <- tabla_csv$Tmax - tabla_csv$Tmin filtro_enero <- filter(tabla_csv, Month == 1) enero_historica <- apply(X = filtro_enero[, c(7, 8)], MARGIN = 2, FUN = max) ``` ``` ## Tmax Amplitud ## 29.69 16.48 ``` -- ¿Cuándo ocurrió la máxima histórica? -- ``` r apply(X = filtro_enero[, c(7, 8)], MARGIN = 2, FUN = which.max) ``` ``` ## Tmax Amplitud ## 39 39 ``` --- ### Manipulando una tablas ``` r filtro_enero[39, ] ```
--- ### Ciclos y Funciones sencillas Un **ciclo** es la repetición de "n veces" una misma rutina. El más conocido y ocupado es el ciclo for que se compone por: <center><img src="data:image/png;base64,#Loop.png" height="120px" /></center> En el ciclo representado la imagen de arriba, nos indica que el "Ãndice" **_i_** en nuestro primer ciclo tomará el valor del número 2, cuando termine ese ciclo, tomará el valor siguiente dentro del rango 2 a 11, es decir el número 3. Por ejemplo: ``` r for (i in 1:10) { print(9 * i) } ``` Significa que en el primer ciclo, imprimirá (print) el resultado de (9 x **_i_**), es decir (9 x **1**), en el segundo (9 x **2**) y siguiento hasta que **_i_** alcance el valor final de nuestro Ãndice, que en este caso es **10**. --- ### Ciclos y Funciones sencillas Crearemos un **ciclo** sencillo en dónde se repita un digitos tantas veces como valor lo indique. ``` r for (i in 2:8) { num <- rep(i, i) print(paste("REPITE ESTE NUMERO ", i, ", ", i, " VECES", sep = "")) print(num) } ``` --- ### Ciclos y Funciones sencillas Entonces el resultado de nuestro ciclo serÃa: ``` r for (i in 2:8) { num <- rep(i, i) print(paste("REPITE ESTE NUMERO ", i, ", ", i, " VECES", sep = "")) print(num) } ``` ``` ## [1] "REPITE ESTE NUMERO 2, 2 VECES" ## [1] 2 2 ## [1] "REPITE ESTE NUMERO 3, 3 VECES" ## [1] 3 3 3 ## [1] "REPITE ESTE NUMERO 4, 4 VECES" ## [1] 4 4 4 4 ## [1] "REPITE ESTE NUMERO 5, 5 VECES" ## [1] 5 5 5 5 5 ## [1] "REPITE ESTE NUMERO 6, 6 VECES" ## [1] 6 6 6 6 6 6 ## [1] "REPITE ESTE NUMERO 7, 7 VECES" ## [1] 7 7 7 7 7 7 7 ## [1] "REPITE ESTE NUMERO 8, 8 VECES" ## [1] 8 8 8 8 8 8 8 8 ``` --- ### Ciclos y Funciones sencillas Ahora, usaremos los condicionales if() y else() para que cada vez que encuentre una temperatura máxima superior a los 25° nos indique esta cara **(T.T)** y cuando sea menor **(n.n)** -- ``` r for (i in 1:nrow(mod)) { val <- mod$Tmax[i] if (val >= 25) { print("(T.T)") } else { print("(n.n)") } } ``` --- ### Guardar nuestra base de datos ``` r # Si queremos guardar nuestra tabla como un csv escribimos... write.csv(tabla_csv, "C:/TuDirectorio/TuNombreDeArchivo.csv", row.names = F) # Si la queremos guardar como excel usamos la libreria xlsx # install.packages(writexl) writexl::write_xlsx(tabla_csv, "C:/TuDirectorio/TuNombreDeArchivo.xlsx") ``` --- ### Ciclos y Funciones sencillas Crearemos una **función** que calcule grados Fahrenheit a partir de grados Celsius -- ``` r CaF <- function(C_temp) { (C_temp * 9 / 5) + 32 } ``` -- ``` r # Calculamos para un valor CaF(C_temp = 25) ``` ``` ## [1] 77 ``` ``` r # Calculamos para un vector numérico print(tabla_csv$Tmed[1:10]) # revisamos los 10 primeros valores de Cauquenes ``` ``` ## [1] 19.28 18.85 17.18 14.49 12.19 8.70 9.85 10.96 10.38 12.72 ``` ``` r CaF(C_temp = tabla_csv$Tmed)[1:10] ``` ``` ## [1] 66.704 65.930 62.924 58.082 53.942 47.660 49.730 51.728 50.684 54.896 ``` --- ### Visualización de nuestra información (Graficar/Plotear) **Gráfico de Barras** simple ``` r cauquenes_2019 <- filter(tabla_csv, Year == 2019) barplot(cauquenes_2019$Tmed) ``` <img src="data:image/png;base64,#DIPGEOPR_01_1_files/figure-html/unnamed-chunk-58-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Gráfico de Barras** con color ``` r barplot(cauquenes_2019$Tmed, col = "red") ``` <img src="data:image/png;base64,#DIPGEOPR_01_1_files/figure-html/unnamed-chunk-60-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Gráfico de Barras** con color y lÃmite del eje Y definido ``` r barplot(cauquenes_2019$Tmed, col = "red", ylim = c(0, 25)) ``` <img src="data:image/png;base64,#DIPGEOPR_01_1_files/figure-html/unnamed-chunk-62-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Gráfico de Barras** con color, lÃmite del eje Y definido y nombres de las barras ``` r barplot(cauquenes_2019$Tmed, col = "red", ylim = c(0, 25), names = month.abb) ``` <img src="data:image/png;base64,#DIPGEOPR_01_1_files/figure-html/unnamed-chunk-64-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Gráfico de Barras** con color, lÃmite del eje Y definido, nombres de las barras y nombres de ejes ``` r barplot(cauquenes_2019$Tmed, col = "red", ylim = c(0, 25), names = month.abb, ylab = "Temperatura (°C)", xlab = "Meses" ) ``` <img src="data:image/png;base64,#DIPGEOPR_01_1_files/figure-html/unnamed-chunk-66-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Gráfico de Puntos** simples ``` r tabla_csv$Date <- as.Date(tabla_csv$Date, format = "%Y-%m-%d") plot(x = tabla_csv$Date, y = tabla_csv$Tmed) ``` <img src="data:image/png;base64,#DIPGEOPR_01_1_files/figure-html/unnamed-chunk-68-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Gráfico de Puntos** con distintas formas y colores ``` r plot( x = tabla_csv$Date, y = tabla_csv$Tmed, pch = 8, col = "red", ylab = "Temperatura Media (C°)", xlab = "Años" ) ``` <img src="data:image/png;base64,#DIPGEOPR_01_1_files/figure-html/unnamed-chunk-70-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) <center><img src="data:image/png;base64,#Symbol.png" height="400px" /></center> --- ### Visualización de nuestra información (Graficar/Plotear) **Gráfico de Lineas** ``` r #A diferencia con el plot anterior ya no usamos el argumento pch, y usamos type para indicar line plot( x = tabla_csv$Date, y = tabla_csv$Tmed, type = "l", col = "red", ylab = "Temperatura Media (C°)", xlab = "Años" ) ``` <img src="data:image/png;base64,#DIPGEOPR_01_1_files/figure-html/unnamed-chunk-72-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Gráfico de Lineas y puntos** ``` r plot( x = tabla_csv$Date, y = tabla_csv$Tmed, pch = 20, col = "brown", ylab = "Temperatura Media (C°)", xlab = "Años" ) # Para agregar las lineas sobre los puntos, usamos la funcion lines() lines(x = tabla_csv$Date, y = tabla_csv$Tmed, col = "red") ``` <img src="data:image/png;base64,#DIPGEOPR_01_1_files/figure-html/unnamed-chunk-74-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Boxplot** ``` r boxplot(tabla_csv$Tmed ~ tabla_csv$Month, col = rainbow(12), names = c("Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"), xlab = "Meses", ylab = "Temperatura Media (C°)" ) ``` <img src="data:image/png;base64,#DIPGEOPR_01_1_files/figure-html/unnamed-chunk-76-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Histograma** ``` r hist(tabla_csv$Tmed, breaks = 50, col = "red", xlab = "Temperatura Media (C°)", ylab = "Frecuencia", main = "Histograma de Precipitaciones; breaks=50" ) ``` <img src="data:image/png;base64,#DIPGEOPR_01_1_files/figure-html/unnamed-chunk-78-1.png" width="100%" /> --- ### Visualización de nuestra información (Graficar/Plotear) **Histograma con boxplot** ``` r par(mfrow = c(2, 1)) # distribuimos el plot en 2 filas 1 columna par(mar = c(2, 2, 2, 2)) # incluimos 2 lineas de separación entre plots boxplot(tabla_csv$Tmed, horizontal = T) hist(tabla_csv$Tmed, breaks = 50, col = "red", main = "") ``` --- ### Visualización de nuestra información (Graficar/Plotear) **Histograma con boxplot** <img src="data:image/png;base64,#DIPGEOPR_01_1_files/figure-html/unnamed-chunk-80-1.png" width="100%" /> --- ### Integrando conceptos Ahora, veremos una situación un poco más complicada: .pull-left[ - Supongamos tenemos 10 archivos que contienen información de la temperatura media de algunas ciudades de la región del Maule, y queremos juntarlas en una. - Si nos fijamos, tenemos una columna con la fecha, el año, el mes y otra con el valor de la temperatura media, por lo que tenemos 4 columnas. - Debemos considerar para es ciclo o loop, el que todas las tablas tengan la misma estructura, misma cantidad filas o columnas (para no complejizar el ejercicio). ] -- .pull-right[ <img src="data:image/png;base64,#Tablas_loop.png" width="500px" align = "center"/> ] --- ### Integrando conceptos ``` r # Primero: crearemos un objeto indicando el directorio donde están nuestros archivos dir <- "C:/TuDirectorio/" # Segundo: crearemos un nuevo objeto con un enlistado de las direcciones para cada archivo ... vector_directorio <- list.files(path = dir, pattern = glob2rx("*.csv"), full.names = T) # glob2rx nos posibilita filtrar según un enunciado. # Tercero: abriremos la primera tabla en la que pegaremos la informacion de las siguientes tabla_meteo <- read.csv(vector_directorio[1]) # Cuarto: preparamos nuestro ciclo for (i in 2:10) { # a) leemos nuestro archivo tabla_meteo_i <- read.csv(vector_directorio[i]) # b) pegamos la 4 columna de nuestro archivo usando la funcion cbind, # reemplazando la tabla original tabla_meteo <- cbind(tabla_meteo, tabla_meteo_i[, 4]) print(paste("LISTA TABLA N°", i, "DE 10", sep = " ")) } ``` --- ### Integrando conceptos ``` r view(tabla_meteo) ```
--- ### Integrando conceptos Ahora es importante cambiarle el nombre a nuestras columnas que quedaron sin nombre. Si nos fijamos en nuestro vector con las rutas a nuestros archivos, contienen los nombres de los puntos de temperatura: ``` r # dejamos el argumento full.names = F para que solo nos muestre el nombre del archivo # y no la ruta completa list.files(path = dir, pattern = glob2rx("*.csv"), full.names = F) ``` ``` ## [1] "Tmean_Cauquenes.csv" "Tmean_Chanco.csv" "Tmean_Constitucion.csv" ## [4] "Tmean_Curepto.csv" "Tmean_Curico.csv" "Tmean_Linares.csv" ## [7] "Tmean_LosRiscos.csv" "Tmean_Robleria.csv" "Tmean_Talca.csv" ## [10] "Tmean_Vichuquen.csv" ``` -- Veremos que hasta "Tmean_" todos los archivos comparten la misma ruta (directorio, carpeta) y comienzan con el mismo nombre. Dependiendo del nombre de cada archivo, cada vector que contiene la "ruta + nombre.csv", tiene una distinta cantidad de caracteres. --- ### Integrando conceptos Por ejemplo: "Tmean_Cauquenes.csv" tiene 19 caracteres y "T_meanLinares.csv" tiene 17. <center><img src="data:image/png;base64,#caracteres.png" height="150px" /></center> De esta forma, sabiendo que hay una constante entre el numero de caracteres antes del nombre (Tmean_), y la misma cantidad de caracteres de la extension (.csv) podemos extraer el nombre usando la funcion _substr()_ y _nchar_: **substr()** nos permite substraer parte de un vector de numérico o alfanumérico, indicando la posición, y **nchar()** nos indica el número de caracteres total de un posiciones de un vector, al cual le restaremos 4 que es la cantidad de posiciones que tiene la extensión del archivo (.csv). --- ### Integrando conceptos ``` r nombre_archivo <- list.files(path = dir, pattern = glob2rx("*.csv"), full.names = F) nombre_temperatura <- substr(x = nombre_archivo, start = 7, stop = nchar(nombre_archivo) - 4) print(nombre_temperatura) ``` ``` ## [1] "Cauquenes" "Chanco" "Constitucion" "Curepto" "Curico" ## [6] "Linares" "LosRiscos" "Robleria" "Talca" "Vichuquen" ``` -- La función **names()** nos permite ver los nombres de nuestra columnas (o variables, dependiendo de la clase del objeto). A su vez, nos permite renombrar las columnas de nuestro data frame (u otra clase de objeto), asignandole un vector que contega los nombres, para ello vamos a escribir: -- ``` r names(tabla_meteo) ``` ``` ## [1] "Date" "Year" "Month" ## [4] "Tmed" "tabla_meteo_i[, 4]" "tabla_meteo_i[, 4]" ## [7] "tabla_meteo_i[, 4]" "tabla_meteo_i[, 4]" "tabla_meteo_i[, 4]" ## [10] "tabla_meteo_i[, 4]" "tabla_meteo_i[, 4]" "tabla_meteo_i[, 4]" ## [13] "tabla_meteo_i[, 4]" ``` ``` r names(tabla_meteo)[4:13] <- nombre_temperatura ``` --- ``` r view(tabla_meteo) ```
--- ### BibliografÃa 2011 Teetor Paul. _R Cookbook: Proven Recipes for Data Analysis, Statistics, and Graphics_. Versión en Linea por Chang Winston. <a href="http://www.cookbook-r.com/"> (Online) </a><br> 2015 McNeill Mhairi. _Base R (RStudio Cheatsheet)_. Disponible en Aula virtual. 2018 Mas, Jean-Francois. _Análisis espacial con R. Usa R como un Sistema de Información Geográfica_. European Scientific Institute, Republic of Macedonia. 2020 R. _The R Project for Statistical Computing_. <a href="https://www.r-project.org/"> (Online) </a><br> 2023 Randahl, David. _The R Researcher’s companion_. <a href="https://bookdown.org/david_randahl/r_book/"> (Online) </a><br> --- class: middle 